import pandas as pd


# 对基数清单 根据'设区市', '实际管理区' 分组求和
# 根据'设区市', '实际管理区' 分组求和结果再按照设区市分组求和
# column_names4group  ['设区市', '实际管理区']为分组的列
# column_name4value  '供应面积'为求和的列
# column_NewName4value  '基数'为求和结果列
def sum_by_column(dataframe, column_names4group,column_name4value,column_NewName4value):
    #根据 column_names4group 数组进行分组并使用列 column_name4value 进行求和
    #sum() 统计的结果为行排列('设区市', '实际管理区','供应面积') reset_index 重置索引
    # grouped_sum('设区市', '实际管理区','供应面积')
    # 赣州市   陇南   100
    # 赣州市   全南   20
    grouped_sum = dataframe.groupby(column_names4group)[column_name4value].sum().reset_index()
    #print(grouped_sum)


    # 根据 column_names4group[0](赣州市)第一列大类对grouped_sum数组进行分组并使用列 column_name4value 进行求和
    # 统计结果为:'设区市','供应面积'
    #           赣州市   120
    #           吉安市   50
    subgrouped_sum = grouped_sum.groupby(column_names4group[0])[column_name4value].sum().reset_index()

    #对子分组增加一个列，列名为column_names4group[1]'实际管理区'，并将值设为'设区市(小计)'
    # 例如：'设区市','供应面积','实际管理区',
    #      赣州市      120   赣州市(小计)
    #     吉安市       50    吉安市(小计)
    subgrouped_sum[column_names4group[1]] = subgrouped_sum[column_names4group[0]].apply(lambda x: f'{x} (小计)')
    #print(subgrouped_sum)

    # 获取总和
    total_sum = dataframe[column_name4value].sum()
    provicegrouped_sum = {column_names4group[0]: ['全省'],
                    column_names4group[1]: ['全省(统计)'],
                    column_name4value: [total_sum]}
    provicegrouped_sum = pd.DataFrame(provicegrouped_sum)

    # 将原始数据和小计数据拼接
    result = pd.concat([grouped_sum, subgrouped_sum,provicegrouped_sum], ignore_index=True).sort_values(
        by=column_names4group)

    # 获取最后一列的名称
    last_column_name = result.columns[-1]
    # 重命名最后一列
    result = result.rename(columns={last_column_name: column_NewName4value})
    # 设置最后一列的数据类型为浮点数
    result[column_NewName4value] = result[column_NewName4value].astype(float)
    result[column_NewName4value] = result[column_NewName4value].fillna(0)

    # 输出结果
    #print(result)
    return result
# 按列求分组大小 dataframe为源数据，column_names4group为分组的列名
def size_by_column(dataframe, column_names4group):
    # 分类统计
    # 按设区市分组并计算项目数量
    grouped_size = dataframe.groupby(column_names4group).size().reset_index(name='count')
    #print(grouped_size)
    # 计算每个 cityName 的小计
    subgrouped_size = dataframe.groupby(column_names4group[0]).size().reset_index(name='count')
    subgrouped_size[column_names4group[1]] = subgrouped_size[column_names4group[0]].apply(lambda x: f'{x} (小计)')
    #print(subgrouped_size)
    # 将原始数据和小计数据合并
    result = pd.concat([grouped_size, subgrouped_size], ignore_index=True).sort_values(
        by=column_names4group)
    # 输出结果
    #print(result)
    return result
def fillna_with_zero(dataframe, column_name):
    dataframe[column_name] = dataframe[column_name].astype(float)
    dataframe[column_name] = dataframe[column_name].fillna(0)
    return dataframe